home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1995 April / Internet Tools.iso / applic / ncsa / Mac / Telnet2.6 / prerelease / d5 / Telnet 2.6.1d5.src.sit.hqx / Telnet 2.6.1d5 src / source / config / prefs.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-12-26  |  13.0 KB  |  394 lines

  1. /****************************************************************
  2. *    NCSA Telnet for the Macintosh                                *
  3. *                                                                *
  4. *    National Center for Supercomputing Applications                *
  5. *    Software Development Group                                    *
  6. *    152 Computing Applications Building                            *
  7. *    605 E. Springfield Ave.                                        *
  8. *    Champaign, IL  61820                                        *
  9. *                                                                *
  10. *    Copyright (c) 1993,                                            *
  11. *    Board of Trustees of the University of Illinois                *
  12. *****************************************************************
  13. *    Revisions:
  14. *    5/93    Telnet 2.6:    Rewritten entirely -- Jim Browne
  15. */
  16.  
  17. #ifdef MPW
  18. #pragma segment Configure
  19. #endif
  20.  
  21. #include "TelnetHeader.h"
  22. #include "string_resrcdefs.h"
  23. #include "debug.h"
  24. #include "telneterrors.h"
  25. #include "prefs.proto.h"
  26. #include "mainseg.proto.h"        // For quit proto
  27.  
  28. FTPServerPrefs*        gFTPServerPrefs=NULL;
  29. ApplicationPrefs*    gApplicationPrefs=NULL;
  30.  
  31. OSErr OpenPreferencesFile( void)
  32. {
  33.     Str255    **PreferencesFileNameHdl;
  34.     OSErr     err;
  35.     
  36.     PreferencesFileNameHdl = (Str255**)GetString(PREFERENCES_FILE_NAME_STR_ID);
  37.     if (PreferencesFileNameHdl == NULL) {
  38.         DebugStr("\pSomeone has deleted the prefs file name resource!");
  39.         forcequit();
  40.         }
  41.     
  42.     HLock((Handle)PreferencesFileNameHdl);
  43.         
  44.     /* look for an existing settings file. */
  45.     /* first, try the application folder */
  46.     TelInfo->SettingsFile=HOpenResFile(TelInfo->ApFolder.vRefNum, TelInfo->ApFolder.parID,
  47.                                             (StringPtr)*PreferencesFileNameHdl,fsRdWrShPerm);
  48.  
  49.     if (TelInfo->SettingsFile == -1) /* Look in System Folder */
  50.         {
  51.         TelInfo->SettingsFile = HOpenResFile(TelInfo->SysFolder.vRefNum, 
  52.                                                 TelInfo->SysFolder.parID, 
  53.                                             (StringPtr)*PreferencesFileNameHdl, fsRdWrShPerm);
  54.         }
  55.  
  56.     if (TelInfo->SettingsFile == -1) /* Look in Preferences Folder */
  57.         {
  58.         TelInfo->SettingsFile = HOpenResFile(TelInfo->PrefFolder.vRefNum, 
  59.                                                 TelInfo->PrefFolder.parID,
  60.                                             (StringPtr)*PreferencesFileNameHdl, fsRdWrShPerm);
  61.         }
  62.  
  63.     if (TelInfo->SettingsFile == -1)
  64.           {
  65.         if ((err = HCreate(TelInfo->PrefFolder.vRefNum, TelInfo->PrefFolder.parID,
  66.                         (StringPtr)*PreferencesFileNameHdl, 'NCSA', 'pref')) != noErr)
  67.             FatalAlert(CANT_CREATE_PREFS, 120, err);
  68.  
  69.         HCreateResFile(TelInfo->PrefFolder.vRefNum, TelInfo->PrefFolder.parID,
  70.                     (StringPtr)*PreferencesFileNameHdl);
  71.  
  72.         if (ResError() != noErr)
  73.             FatalAlert(CANT_CREATE_PREFS, 120, ResError());
  74.  
  75.         TelInfo->SettingsFile = HOpenResFile(TelInfo->PrefFolder.vRefNum, 
  76.                                                 TelInfo->PrefFolder.parID,
  77.                                             (StringPtr)*PreferencesFileNameHdl, fsRdWrShPerm);
  78.  
  79.         if (TelInfo->SettingsFile == -1)
  80.             FatalAlert(CANT_CREATE_PREFS, 120, ResError());        // Give up
  81.             
  82.         if ((err = NewPreferences()) != noErr) return(err);
  83.           }
  84.         
  85.     UseResFile(TelInfo->SettingsFile);
  86.     ReleaseResource((Handle)PreferencesFileNameHdl);
  87.  
  88.     return    noErr;
  89. }
  90.  
  91. OSErr NewPreferences(void)
  92. {
  93.     ApplicationPrefs    **AppPrefsHdl;
  94.     FTPServerPrefs        **FTPPrefsHdl;
  95.     SessionPrefs        **DefaultSessionPrefs;
  96.     TerminalPrefs        **DefaultTerminalPrefs;
  97.         
  98.     // Get the master copies from the application's resource fork
  99.     
  100.     AppPrefsHdl = (ApplicationPrefs **)GetResource(APPLICATIONPREFS_RESTYPE, APPLICATIONPREFS_APPID);
  101.     if ((ResError() != noErr) || (AppPrefsHdl == NULL)) return(ResError());
  102.     DetachResource((Handle)AppPrefsHdl);
  103.     
  104.     FTPPrefsHdl = (FTPServerPrefs **)GetResource(FTPSERVERPREFS_RESTYPE, FTPSERVERPREFS_APPID);
  105.     if ((ResError() != noErr) || (FTPPrefsHdl == NULL)) return(ResError());
  106.     DetachResource((Handle)FTPPrefsHdl);
  107.  
  108.     DefaultSessionPrefs = (SessionPrefs **)GetResource(SESSIONPREFS_RESTYPE, SESSIONPREFS_APPID);
  109.     if ((ResError() != noErr) || (DefaultSessionPrefs == NULL)) return(ResError());
  110.     DetachResource((Handle)DefaultSessionPrefs);
  111.     
  112.     DefaultTerminalPrefs = (TerminalPrefs **)GetResource(TERMINALPREFS_RESTYPE, TERMINALPREFS_APPID);
  113.     if ((ResError() != noErr) || (DefaultTerminalPrefs == NULL)) return(ResError());
  114.     DetachResource((Handle)DefaultTerminalPrefs);
  115.  
  116.     // Add them to the Preferences file
  117.     
  118.     UseResFile(TelInfo->SettingsFile);
  119.     if (ResError() != noErr) return(ResError());
  120.     AddResource((Handle)AppPrefsHdl, APPLICATIONPREFS_RESTYPE, APPLICATIONPREFS_ID, "\p");
  121.     if (ResError() != noErr) return(ResError());
  122.     AddResource((Handle)FTPPrefsHdl,FTPSERVERPREFS_RESTYPE, FTPSERVERPREFS_ID, "\p");
  123.     if (ResError() != noErr) return(ResError());
  124.     AddResource((Handle)DefaultSessionPrefs,SESSIONPREFS_RESTYPE, SESSIONPREFS_APPID, "\p<Default>");
  125.     if (ResError() != noErr) return(ResError());
  126.     AddResource((Handle)DefaultTerminalPrefs,TERMINALPREFS_RESTYPE, TERMINALPREFS_APPID, "\p<Default>");
  127.     if (ResError() != noErr) return(ResError());
  128.  
  129.     // Update the preferences file and release the resources
  130.     
  131.     UpdateResFile(TelInfo->SettingsFile);
  132.     ReleaseResource((Handle)AppPrefsHdl);
  133.     ReleaseResource((Handle)FTPPrefsHdl);
  134.     ReleaseResource((Handle)DefaultSessionPrefs);
  135.     ReleaseResource((Handle)DefaultTerminalPrefs);
  136.     return(ResError());
  137. }
  138.  
  139. OSErr LoadPreferences(void)
  140. {
  141.     ApplicationPrefs    **AppPrefsHdl;
  142.     FTPServerPrefs        **FTPPrefsHdl;
  143.     
  144.     UseResFile(TelInfo->SettingsFile);
  145.     if (ResError() != noErr) return(ResError());
  146.     
  147.     AppPrefsHdl = (ApplicationPrefs **)GetResource(APPLICATIONPREFS_RESTYPE, APPLICATIONPREFS_ID);
  148.     if ((ResError() != noErr) || (AppPrefsHdl == NULL)) return(ResError());
  149.  
  150.     HLock((Handle) AppPrefsHdl);
  151.     BlockMove(*AppPrefsHdl, gApplicationPrefs, sizeof(ApplicationPrefs));
  152.     ReleaseResource((Handle) AppPrefsHdl);
  153.     
  154.     FTPPrefsHdl = (FTPServerPrefs **)GetResource(FTPSERVERPREFS_RESTYPE, FTPSERVERPREFS_ID);
  155.     if ((ResError() != noErr) || (FTPPrefsHdl == NULL)) return(ResError());
  156.  
  157.     HLock((Handle) FTPPrefsHdl);
  158.     BlockMove(*FTPPrefsHdl, gFTPServerPrefs, sizeof(FTPServerPrefs));
  159.     ReleaseResource((Handle) FTPPrefsHdl);
  160.     
  161.     return(noErr);
  162. }
  163.  
  164. OSErr SavePreferences(void)
  165. {
  166.     ApplicationPrefs    **AppPrefsHdl;
  167.     FTPServerPrefs        **FTPPrefsHdl;
  168.     Boolean                UserHasBeenAlerted = FALSE, UserResponse;
  169.     
  170.     UseResFile(TelInfo->SettingsFile);
  171.     if (ResError() != noErr) return(ResError());
  172.     
  173.     AppPrefsHdl = (ApplicationPrefs **)GetResource(APPLICATIONPREFS_RESTYPE, APPLICATIONPREFS_ID);
  174.     if ((ResError() != noErr) || (AppPrefsHdl == NULL)) return(ResError());
  175.  
  176.     HLock((Handle) AppPrefsHdl);
  177.     if (gApplicationPrefs->version < (*AppPrefsHdl)->version) {
  178.         UserResponse = AskUserAlert(PREFS_ARE_NEWER_ID, TRUE);        // Cancel is default
  179.         if (UserResponse == TRUE) return(noErr);    // User doesn't want to destroy prefs
  180.         UserHasBeenAlerted = TRUE;                    // Don't ask the user twice!
  181.         }
  182.         
  183.     BlockMove(gApplicationPrefs, *AppPrefsHdl, sizeof(ApplicationPrefs));
  184.     ChangedResource((Handle) AppPrefsHdl);
  185.     
  186.     FTPPrefsHdl = (FTPServerPrefs **)GetResource(FTPSERVERPREFS_RESTYPE, FTPSERVERPREFS_ID);
  187.     if ((ResError() != noErr) || (FTPPrefsHdl == NULL)) return(ResError());
  188.  
  189.     HLock((Handle) FTPPrefsHdl);
  190.     if ((gFTPServerPrefs->version < (*FTPPrefsHdl)->version) && (!UserHasBeenAlerted)) {
  191.         UserResponse = AskUserAlert(PREFS_ARE_NEWER_ID, TRUE);        // Cancel is default
  192.         if (UserResponse == TRUE) return(noErr);    // User doesn't want to destroy prefs
  193.         }
  194.                 
  195.     BlockMove(gFTPServerPrefs, *FTPPrefsHdl, sizeof(FTPServerPrefs));
  196.     ChangedResource((Handle) FTPPrefsHdl);
  197.  
  198.     UpdateResFile(TelInfo->SettingsFile);
  199.     ReleaseResource((Handle) AppPrefsHdl);
  200.     ReleaseResource((Handle) FTPPrefsHdl);
  201.     return(noErr);
  202. }
  203.  
  204. TerminalPrefs    **GetDefaultTerminal(void)
  205. {
  206.     TerminalPrefs    **theTerminalHdl;
  207.     short            scratchshort;
  208.     
  209.     UseResFile(TelInfo->SettingsFile);
  210.     theTerminalHdl = (TerminalPrefs **)Get1NamedResource(TERMINALPREFS_RESTYPE, "\p<Default>");
  211.     
  212.     // If there is an error here, we put up a dialog box about the prefs
  213.     // being messed up and then we restore the default from the master copy
  214.     // in the application's resource fork.
  215.     
  216.     if (theTerminalHdl == NULL) {
  217.         FatalCancelAlert(PREFERENCES_PROBLEM, "\pRepair", 110, ResError());
  218.         UseResFile(TelInfo->ApplicationFile);
  219.         theTerminalHdl = (TerminalPrefs **)Get1NamedResource(TERMINALPREFS_RESTYPE, "\p<Default>");
  220.         
  221.         // If the master copy is not there, it's a fatal error!
  222.         if (theTerminalHdl == NULL)
  223.             FatalAlert(RESOURCE_PROBLEM, 111, ResError());    // Doesn't return
  224.         
  225.         DetachResource((Handle)theTerminalHdl);    
  226.         UseResFile(TelInfo->SettingsFile);
  227.         scratchshort = Unique1ID(TERMINALPREFS_RESTYPE);
  228.         AddResource((Handle)theTerminalHdl, TERMINALPREFS_RESTYPE, scratchshort, "\p<Default>");
  229.  
  230.         // If an error ocurred fixing the prefs file, it's a fatal error!
  231.         if (ResError() != noErr) 
  232.             FatalAlert(NUKED_PREFS, 112, ResError());    // Doesn't return
  233.             
  234.         UpdateResFile(TelInfo->SettingsFile);
  235.         }
  236.         
  237.     DetachResource((Handle)theTerminalHdl);
  238.     return(theTerminalHdl);
  239. }
  240.  
  241. SessionPrefs    **GetDefaultSession(void)
  242. {
  243.     SessionPrefs    **theSessionHdl;
  244.     short            scratchshort;
  245.     
  246.     UseResFile(TelInfo->SettingsFile);
  247.     theSessionHdl = (SessionPrefs **)Get1NamedResource(SESSIONPREFS_RESTYPE, "\p<Default>");
  248.  
  249.     // If there is an error here, we put up a dialog box about the prefs
  250.     // being messed up and then we restore the default from the master copy
  251.     // in the application's resource fork.
  252.     
  253.     if (theSessionHdl == NULL) {
  254.         FatalCancelAlert(PREFERENCES_PROBLEM, "\pRepair", 100, ResError());
  255.         UseResFile(TelInfo->ApplicationFile);
  256.         theSessionHdl = (SessionPrefs **)Get1NamedResource(SESSIONPREFS_RESTYPE, "\p<Default>");
  257.         
  258.         // If the master copy is not there, it's a fatal error!
  259.         if (theSessionHdl == NULL)
  260.             FatalAlert(RESOURCE_PROBLEM, 101, ResError());    // Doesn't return
  261.             
  262.         DetachResource((Handle)theSessionHdl);
  263.         UseResFile(TelInfo->SettingsFile);
  264.         scratchshort = Unique1ID(SESSIONPREFS_RESTYPE);
  265.         AddResource((Handle)theSessionHdl, SESSIONPREFS_RESTYPE, scratchshort, "\p<Default>");
  266.  
  267.         // If an error ocurred fixing the prefs file, it's a fatal error!
  268.         if (ResError() != noErr) 
  269.             FatalAlert(NUKED_PREFS, 102, ResError());    // Doesn't return
  270.             
  271.         UpdateResFile(TelInfo->SettingsFile);
  272.         }
  273.         
  274.     DetachResource((Handle)theSessionHdl);
  275.     return(theSessionHdl);
  276. }
  277.  
  278. void    GetHostNameFromSession(StringPtr string)
  279. {
  280.     SessionPrefs    **sessHdl;
  281.     
  282.     UseResFile(TelInfo->SettingsFile);
  283.     sessHdl = (SessionPrefs **)Get1NamedResource(SESSIONPREFS_RESTYPE, string);
  284.     HLock((Handle)sessHdl);
  285.     
  286.     BlockMove((**sessHdl).hostname, string, Length((**sessHdl).hostname)+1);
  287.     
  288.     ReleaseResource((Handle)sessHdl);
  289. }
  290.  
  291. //    We recognize the following input string: "xxxx yyyy"
  292. //    If "xxxx" matches a session name, that session record is used.  Otherwise, the default
  293. //    session record is used with "xxxx" as the DNS hostname.   "yyyy", if extant, is
  294. //    converted to a number.  If it is a valid number, it is used as the port to connect to.
  295. //    WARNING: Do not pass this routing a blank string.  (We check this in PresentOpenConnectionDialog.)
  296. ConnInitParams    **NameToConnInitParams(StringPtr InputString)
  297. {
  298.     ConnInitParams    **theHdl;
  299.     SessionPrefs    **sessHdl;
  300.     TerminalPrefs    **termHdl;
  301.     short            portRequested;
  302.     Boolean            foundPort;
  303.     
  304.     theHdl = (ConnInitParams **)NewHandleClear(sizeof(ConnInitParams));
  305.     
  306.     foundPort = ProcessHostnameString(InputString, &portRequested);        
  307.         
  308.     UseResFile(TelInfo->SettingsFile);
  309.     sessHdl = (SessionPrefs **)Get1NamedResource(SESSIONPREFS_RESTYPE, InputString);
  310.     if (sessHdl == NULL) {                // Connect to host xxxx w/default session.
  311.         sessHdl = GetDefaultSession();
  312.         DetachResource((Handle) sessHdl);
  313.         HLock((Handle)sessHdl);
  314.         BlockMove(InputString, (**sessHdl).hostname, 64);
  315.         }
  316.     else {    
  317.         DetachResource((Handle) sessHdl);
  318.         HLock((Handle)sessHdl);
  319.         }
  320.  
  321.     (**theHdl).session = sessHdl;
  322.     
  323.     UseResFile(TelInfo->SettingsFile);
  324.     termHdl = (TerminalPrefs **)Get1NamedResource(TERMINALPREFS_RESTYPE, (**sessHdl).TerminalEmulation);
  325.     if (termHdl == NULL) termHdl = GetDefaultTerminal();
  326.     DetachResource((Handle) termHdl);
  327.     (**theHdl).terminal = termHdl;
  328.     HUnlock((Handle)sessHdl);
  329.     
  330.     ((**theHdl).WindowName)[0] = 0;
  331.     (**sessHdl).ip_address = 0;
  332.     
  333.     if (foundPort) (**sessHdl).port = portRequested;
  334.     
  335.     return(theHdl);
  336. }
  337.  
  338. ConnInitParams    **ReturnDefaultConnInitParams(void)
  339. {
  340.     ConnInitParams    **theHdl;
  341.  
  342.     theHdl = (ConnInitParams **)NewHandleClear(sizeof(ConnInitParams));
  343.  
  344.     (**theHdl).session = GetDefaultSession();
  345.     (**(**theHdl).session).ip_address = 0;
  346.     (**theHdl).terminal = GetDefaultTerminal();
  347.     
  348.     return(theHdl);
  349. }
  350.  
  351. Boolean            ProcessHostnameString(StringPtr    HostnameString, short *port)
  352. {
  353.     Str255            MungeString;
  354.     short            scratchshort;
  355.     long            portRequested;
  356.     StringPtr        xxxxptr, yyyyptr;
  357.     Boolean            foundPort = FALSE;
  358.     
  359.     //    Copy the whole damn thing over
  360.     BlockMove(HostnameString, MungeString, 255);
  361.     
  362.     //    Remove leading spaces
  363.     scratchshort = 1;
  364.     while((scratchshort <= Length(MungeString)) && (MungeString[scratchshort] == ' '))
  365.         scratchshort++;
  366.     
  367.     if (scratchshort > Length(MungeString)) {
  368.         HostnameString[0] = 0;
  369.         return(FALSE);
  370.         }
  371.  
  372.     xxxxptr = &MungeString[scratchshort-1];
  373.     
  374.     //    Now look for a port number...
  375.     while((scratchshort <= Length(MungeString)) && (MungeString[scratchshort] != ' '))
  376.         scratchshort++;
  377.     
  378.     yyyyptr = &MungeString[scratchshort];
  379.     
  380.     if (scratchshort < Length(MungeString)) {
  381.         MungeString[scratchshort] = Length(MungeString) - scratchshort;
  382.         StringToNum(&MungeString[scratchshort], &portRequested);
  383.         if ((portRequested > 0) && (portRequested < 65535))    foundPort = TRUE;
  384.         }
  385.     
  386.     xxxxptr[0] = yyyyptr - xxxxptr - 1;
  387.  
  388.     //    Copy parsed hostname string back
  389.     BlockMove(xxxxptr, HostnameString, Length(xxxxptr)+1);
  390.     
  391.     *port = (short)portRequested;
  392.     
  393.     return(foundPort);
  394. }